package com.chuxing.system.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.chuxing.config.PermissionsState;
import com.chuxing.config.SecurityRole;
import com.chuxing.domain.DTO.InterviewListDTO;
import com.chuxing.domain.Interview;
import com.chuxing.domain.Result;
import com.chuxing.domain.VO.PageResultVO;
import com.chuxing.exception.GenericException;
import com.chuxing.exception.UnauthorizedException;
import com.chuxing.system.service.IInterviewService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 面试信息Controller
 * 
 * @author 刘祺
 * @date 2024-12-10
 */
@RestController
@RequestMapping("/system/interview")
@Tag(name = "面试信息服务", description = "面试信息服务相关接口")
public class InterviewController
{
    private static final Logger log = LoggerFactory.getLogger(InterviewController.class);
    @Autowired
    private IInterviewService interviewService;

    /**
     * 查询面试信息列表
     */
    @Operation(summary = "管理员查询面试信息列表", description = "管理员查询面试信息列表")
    @GetMapping("/list")
    public Result<PageResultVO> list(InterviewListDTO  interviewListDTO)
    {
        log.info("管理员查询面试信息列表{}", interviewListDTO);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        PageResultVO list = interviewService.selectInterviewList(interviewListDTO);
        log.info("管理员查询面试信息列表成功{}", list);
        return Result.success( "获取面试列表成功", list);
    }

//    /**
//     * 导出面试信息列表
//     */
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, Interview interview)
//    {
//        List<Interview> list = interviewService.selectInterviewList(interview);
//        ExcelUtil<Interview> util = new ExcelUtil<Interview>(Interview.class);
//        util.exportExcel(response, list, "面试信息数据");
//    }

    /**
     * 获取面试信息详细信息
     */
    @Operation(summary = "管理员获取面试信息详细信息", description = "管理员根据面试及面试时间ID获取详细信息")
    @GetMapping(value = "/{intvId}")
    public Result<Interview> getInfo(@PathVariable("intvId") Long intvId)
    {
        log.info("管理员获取面试信息详细信息，参数为：{}", intvId);
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        Interview interview = interviewService.selectInterviewByIntvId(intvId);
        log.info("管理员获取面试信息详细信息成功，结果为：{}", interview);
        return Result.success( "获取面试信息成功",interview);
    }

    /**
     * 新增面试信息
     */
    @Operation(summary = "管理员新增面试信息", description = "管理员新增面试信息")
    @PostMapping
    public Result<Object> add(@RequestBody Interview interview)
    {
        log.info("管理员新增面试信息{}", interview);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        interviewService.insertInterview(interview);
        log.info("管理员新增面试信息成功");
        return Result.success("新增面试信息成功");
    }

    /**
     * 修改面试信息
     */
    @Operation(summary = "管理员修改面试信息", description = "管理员修改面试信息")
    @PutMapping
    public Result<Object> edit(@RequestBody Interview interview)
    {
        log.info("管理员修改面试信息{}", interview);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        interviewService.updateInterview(interview);
        log.info("管理员修改面试信息成功");
        return Result.success("修改面试信息成功");
    }

    /**
     * 删除面试信息
     */
    @Operation(summary = "管理员删除面试信息", description = "管理员根据面试及面试时间ID删除面试信息")
	@DeleteMapping("/{intvIds}")
    public Result<Object> remove(@PathVariable Long[] intvIds)
    {
        log.info("管理员删除面试信息{}", intvIds);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        interviewService.deleteInterviewByIntvIds(intvIds);
        log.info("管理员删除面试信息成功");
        return Result.success("删除面试信息成功");
    }

    /**
     * 获取面试信息
     * 该方法用于响应GET请求以获取面试相关信息它首先记录了请求的开始，
     * 然后调用服务层方法获取面试信息，并在获取成功后记录结果最后，它返回一个
     * 包含面试信息的成功结果对象整个过程主要用于演示如何通过RESTful API
     * 提供面试信息查询服务
     *
     * @return 返回包含面试信息的Result对象如果获取信息成功，将返回HTTP状态码200
     *         和相应的面试信息
     */
    @Operation(summary = "获取面试信息", description = "获取面试信息")
    @GetMapping("/getIntvInfo")
    public Result<Interview> getIntvInfo() {
        // 记录获取面试信息请求的开始
        log.info("获取面试信息");
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 调用服务层方法，获取面试信息
        Interview interview = interviewService.getIntvInfo(StpUtil.getLoginIdAsString());
        // 记录获取面试信息成功的日志，并输出面试信息
        log.info("获取面试信息成功，结果为：{}", interview);
        // 返回包含成功信息和面试信息的对象
        return Result.success("获取面试信息成功", interview);
    }

    /**
     * 保存面试信息的接口方法
     * 该方法通过POST请求接收面试信息，并将其保存到系统中
     *
     * @param interview 面试对象，包含面试的相关信息，如面试时间、地点等
     * @return 返回保存结果，包括成功与否的信息
     */
    @Operation(summary = "保存面试信息", description = "保存面试信息")
    @PostMapping("/saveIntvInfo")
    public Result<Object> saveIntvInfo(@RequestBody Interview interview) {
    	// 记录保存面试信息的日志，包括面试对象的详细信息
    	log.info("保存面试信息，参数为：{}", interview);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        interview.setStudentId(StpUtil.getLoginIdAsString());
    	// 调用服务层方法，实际执行面试信息的保存操作
    	interviewService.saveExamInfo(interview);
    	// 记录保存成功后的日志
    	log.info("保存面试信息成功");
    	// 返回保存成功地响应结果
    	return Result.success("保存面试信息成功");
    }

    /*
     * 清除面试信息
     */
    @Operation(summary = "清除面试信息", description = "清除面试信息")
    @DeleteMapping("/clear")
    public Result<Object> clear() {
    	// 记录清除面试信息的日志
    	log.info("清除面试信息");
    	// 检查用户是否已登录
    	if (!StpUtil.isLogin()) {
    		throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
    	}
    	// 调用服务层方法，清除面试信息
    	interviewService.clear(StpUtil.getLoginIdAsString());
        return Result.success("清除面试信息成功");
    }
}
